package com.ljy.my_study.lintcode.餐厅的数量;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;

/** 
* @author James
* @date 2019年2月2日 
*/
public class TestMain {
//	给出一个List，里面的数据代表每一个餐厅的坐标[x, y]。顾客的坐标处于原点[0, 0]。先找出n家离顾客位置最近的餐厅，然后取 n 家先出现在List中且与顾客的距离不超过 n 家离顾客最近的餐厅的最长距离。返回这 n 家餐厅的坐标序列，按输入数据原始的顺序。
//
//	样例
//	给定 : n = 2 , List = [[0,0],[1,1],[2,2]]
//	返回 : [[0,0],[1,1]]
//	给定 : n = 3,List = [[0,1],[1,2],[2,1],[1,0]]
//	返回 :[[0,1],[1,2],[2,1]]
//	注意事项
//	1.坐标的范围[-1000, 1000]
//	2.n > 0
//	3.不存在相同的坐标
	public static void main(String[] args) {
		System.out.println(nearestRestaurant(createRestaurant("[[0,0],[2,2],[1,1]]"),2));
	}
	
	public static List<List<Integer>> createRestaurant(String json) {
		if(json.length()<=2) {
			return new ArrayList<>();
		}
		String subJson=json.substring(2, json.length()-2);
		String[] subArr=subJson.split("\\],\\[");
		List<List<Integer>> result=new ArrayList<>(); 
		for(String sub:subArr) {
			String[] ss=sub.split(",");
			List<Integer> subList=new ArrayList<>();
			subList.add(Integer.valueOf(ss[0]));
			subList.add(Integer.valueOf(ss[1]));
			result.add(subList);
		}
		return result;
	}
	
	public static List<List<Integer>> nearestRestaurant(List<List<Integer>> restaurant, int n) {
		if(n==0) return null;
		if(restaurant.size()<n) return null;
		List<List<Integer>> copyList=new ArrayList<>(restaurant);
		Collections.sort(copyList, new Comparator<List<Integer>>() {
			@Override
			public int compare(List<Integer> o1, List<Integer> o2) {
				Integer o1x=o1.get(0);
				Integer o1y=o1.get(1);
				Integer o2x=o2.get(0);
				Integer o2y=o2.get(1);
				if(Math.pow(Double.valueOf(o1x),2)+Math.pow(Double.valueOf(o1y),2)
					>=Math.pow(Double.valueOf(o2x),2)+Math.pow(Double.valueOf(o2y),2)) 
					return 1;
				else 
					return -1;
			}
		});
		System.out.println(copyList);
		List<Integer> max= copyList.get(n-1);
		List<List<Integer>> result=new ArrayList<>();
		for(List<Integer> r:restaurant) {
			if(Math.pow(Double.valueOf(r.get(0)),2)+Math.pow(Double.valueOf(r.get(1)),2)
			<=Math.pow(Double.valueOf(max.get(0)),2)+Math.pow(Double.valueOf(max.get(1)),2))
				if(result.size()<n)
				result.add(r);
		};
		return result;
	}
}
